package com.microservice.api.wechat;

import com.microservice.api.common.PageResult;
import com.microservice.api.common.Result;
import com.microservice.api.wechat.dto.ArticleDTO;
import com.microservice.api.wechat.dto.ArticleReviewRecordDTO;
import com.microservice.api.wechat.dto.UserBindConfigDTO;
import com.microservice.api.wechat.dto.UserStatisticsDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 文章服务API接口
 * 定义wechat-service的文章管理相关接口
 * 
 * @author common-api
 */
@FeignClient(name = "wechat-service", contextId = "articleServiceApi", path = "/article")
public interface ArticleServiceClient {
    
    /**
     * 新增文章
     * 
     * @param article 文章信息
     * @return 创建的文章
     */
    @PostMapping
    Result<ArticleDTO> save(@RequestBody ArticleDTO article);
    
    /**
     * 根据ID删除文章
     * 
     * @param id 文章ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    Result<String> delete(@PathVariable("id") Long id);
    
    /**
     * 更新文章
     * 
     * @param article 文章信息
     * @return 更新后的文章
     */
    @PutMapping
    Result<ArticleDTO> update(@RequestBody ArticleDTO article);
    
    /**
     * 根据ID查询文章
     * 
     * @param id 文章ID
     * @return 文章信息
     */
    @GetMapping("/{id}")
    Result<ArticleDTO> getById(@PathVariable("id") Long id);


    /**
     * 根据用戶ID查询綁定的公衆號
     *
     * @param id 用戶ID
     * @return 賬號信息
     */
    @GetMapping("/bind-accounts/{id}")
    Result<List<UserBindConfigDTO>> getUserBindAccount(@PathVariable("id") Long id);
    
    /**
     * 分页查询文章（支持条件过滤）
     * 
     * @param current 当前页
     * @param size 每页大小
     * @param status 状态（可选）
     * @param userId 用户ID（可选）
     * @return 分页结果
     */
    @GetMapping("/page")
    Result<PageResult<ArticleDTO>> page(
            @RequestParam(value = "current", defaultValue = "1") int current,
            @RequestParam(value = "size", defaultValue = "10") int size,
            @RequestParam(value = "status", required = false) Integer status,
            @RequestParam(value = "userId", required = false) String userId);
    
    /**
     * 根据用户ID分页查询文章
     * 
     * @param userId 用户ID
     * @param current 当前页
     * @param size 每页大小
     * @return 分页结果
     */
    @GetMapping("/user/{userId}")
    Result<PageResult<ArticleDTO>> listByUserId(
            @PathVariable("userId") String userId,
            @RequestParam(value = "status", required = false) Integer status,
            @RequestParam(value = "current", defaultValue = "1") int current,
            @RequestParam(value = "size", defaultValue = "10") int size);
    
    /**
     * 根据状态分页查询文章
     * 
     * @param status 状态
     * @param current 当前页
     * @param size 每页大小
     * @return 分页结果
     */
    @GetMapping("/status/{status}")
    Result<PageResult<ArticleDTO>> listByStatus(
            @PathVariable("status") Integer status,
            @RequestParam(value = "current", defaultValue = "1") int current,
            @RequestParam(value = "size", defaultValue = "10") int size);
    
    /**
     * 批量删除文章
     * 
     * @param ids 文章ID数组
     * @return 删除结果
     */
    @DeleteMapping("/batch")
    Result<String> deleteBatch(@RequestBody Long[] ids);
    
    /**
     * 更新文章状态
     * 
     * @param id 文章ID
     * @param status 状态
     * @return 更新结果
     */
    @PutMapping("/{id}/status/{status}")
    Result<String> updateStatus(
            @PathVariable("id") Long id,
            @PathVariable("status") Integer status);
    
    /**
     * 获取用户统计信息
     * 统计已通过审核的文章数量和所有文章的总浏览量
     * 
     * @param userId 用户ID
     * @return 用户统计信息
     */
    @GetMapping("/statistics/{userId}")
    Result<UserStatisticsDTO> getUserStatistics(@PathVariable("userId") Long userId);
    
    /**
     * 审核文章（支持通过和拒绝，拒绝时记录原因）
     * 
     * @param id 文章ID
     * @param status 审核状态：1-通过，2-拒绝
     * @param rejectReason 拒绝原因（状态为2时必填）
     * @param reviewerId 审核人员ID
     * @param reviewerName 审核人员姓名
     * @return 审核结果
     */
    @PostMapping("/review/{id}")
    Result<String> reviewArticle(
            @PathVariable("id") Long id,
            @RequestParam("status") Integer status,
            @RequestParam(value = "rejectReason", required = false) String rejectReason,
            @RequestParam("reviewerId") Long reviewerId,
            @RequestParam("reviewerName") String reviewerName);
    
    /**
     * 查询文章的审核记录列表
     * 
     * @param articleId 文章ID
     * @return 审核记录列表
     */
    @GetMapping("/review/records/{articleId}")
    Result<java.util.List<ArticleReviewRecordDTO>> getReviewRecords(@PathVariable("articleId") Long articleId);
    
    /**
     * 查询文章的最新审核记录
     * 
     * @param articleId 文章ID
     * @return 最新审核记录
     */
    @GetMapping("/review/latest/{articleId}")
    Result<ArticleReviewRecordDTO> getLatestReviewRecord(@PathVariable("articleId") Long articleId);
}
